#include "head.h"

// 菜单信息 - 登陆用
const wchar_t *title = L"普通用户菜单";
const wchar_t *option_1[] = {L"登录", L"注册", L"返回"};

// 菜单信息 - 管理员用
const wchar_t *title_root = L"用户菜单";
const wchar_t *option_root[] = {
    L"设定航班",
    L"修改航班",
    L"修改普通用户",
    L"退出"};

const wchar_t *option_root_del[] = {
    L"删除", L"全删", L"返回"};

const wchar_t *amend_user_option[] = {
    L"白金会员",
    L"金卡会员",
    L"银卡会员",
    L"普通用户"};

const wchar_t *amend_user_1_1[] = {
    L"改用户等级", L"改用户信息", L"返回"};

// 菜单信息 - 普通用户用
const wchar_t *title_user = L"用户菜单";
const wchar_t *option_user[] = {
    L"购票",
    L"退票",
    L"余额充值",
    L"查看航班",
    L"修改密码",
    L"我的订单",
    L"退出"};

// 系统初始化
FlightSystem Sys_init(void)
{
    FlightSystem Flight_sys;
    Flight_sys.Flight_list = D_List_init();   // 航班信息
    Flight_sys.ADMIN_USER = S_List_init();    // 管理员账户信息
    Flight_sys.REGULAR_USER = S_List_init();  // 普通用户信息
    Flight_sys.SILVER_USER = S_List_init();   // 银卡会员信息 (9折)
    Flight_sys.GOLD_USER = S_List_init();     // 金卡会员信息 (8折)
    Flight_sys.PLATINUM_USER = S_List_init(); // 白金会员信息 (7折)

    // 从文件中导入数据
    D_List_file_scanf(Flight_sys.Flight_list);                  // 航班信息
    S_List_File_scanf(Flight_sys.ADMIN_USER, ADMIN_FILE);       // 管理员账户信息文件
    S_List_File_scanf(Flight_sys.REGULAR_USER, REGULAR_FILE);   // 普通用户信息文件
    S_List_File_scanf(Flight_sys.SILVER_USER, SILVER_FILE);     // 银卡会员信息文件 (9折)
    S_List_File_scanf(Flight_sys.GOLD_USER, GOLD_FILE);         // 金卡会员信息文件 (8折)
    S_List_File_scanf(Flight_sys.PLATINUM_USER, PLATINUM_FILE); // 白金会员信息文件 (7折)

    system("clear");
    return Flight_sys;
}


// 系统注册
void sys_regist_user(FlightSystem Flight_sys)
{
    // 用户信息合表
    U_list *list = S_List_init();
    list = S_List_merge(list, Flight_sys.ADMIN_USER);    // 管理员账户信息文件
    list = S_List_merge(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = S_List_merge(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = S_List_merge(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = S_List_merge(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)

    U_data new_user;
    new_user = regist_user(list);
    S_List_insert(Flight_sys.REGULAR_USER, new_user, 1);
    S_List_File_print(Flight_sys.REGULAR_USER ,REGULAR_FILE);
}

// 系统登录
U_data Sys_log_in(FlightSystem Flight_sys)
{
    // 用户信息合表
    U_list *list = S_List_init();
    list = S_List_merge(list, Flight_sys.ADMIN_USER);    // 管理员账户信息文件
    list = S_List_merge(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = S_List_merge(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = S_List_merge(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = S_List_merge(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)

    
    // 开始登录
    U_data log_data = Log_in(list);
    return log_data;
}

// 系统菜单
void Sys_menu(F_list *Flight_list, U_data log_data, FlightSystem Flight_sys)
{
    F_data newdata;
    char new_passwd[90];
    S_arr_list *ptr_1_1 = S_Arr_Init(); //顺序表的创建
    int line;
    // 分支
    int flag = 0;

    switch (log_data.grade)
    {
    case 1:
        // 管理员功能界面
        printf("欢迎管理员用户登陆\n");
        flag = display_menu(title_root, option_root, 4);
        break;
    default:
        // 普通用户功能界面
        printf("欢迎普通用户登陆\n");
        flag = display_menu(title_user, option_user, 7) + 4;
        break;
    }

    // 菜单选项分支处理
    switch (flag)
    {
    case 1:
        // 管理员 - 设定航班

        input_flight_data(&newdata);
        printf("请输入你要插入的行数：");
        scanf("%d", &line);
        D_List_insert(Flight_list, newdata, line);
        D_List_file_print(Flight_list);
        D_List_file_scanf(Flight_list);
        printf("设定成功\n");
        system("clear"); // 清屏

        D_List_print(Flight_list);

        break;
    case 2:
        // 管理员 - 修改航班
        Modify_flight_information(Flight_list, newdata);
        break;
    case 3: //管理员修改普通用户等级
        amend_user(log_data, Flight_sys);
        break;
    case 4:
        // 退出
        break;
    case 5:
        // 用户 - 购票
        D_List_print(Flight_sys.Flight_list);
        printf("请输入你想购买班次的行数：");
        scanf("%d", &line);
        buy_ticket(Flight_sys, log_data, line);
        break;
    case 6:
        // 用户 - 退票
        S_Arr_File_print(ptr_1_1, ARR);
        S_Arr_delete_trick(Flight_sys, log_data, ptr_1_1);
        break;
    case 7:
        // 用户 - 余额充值
        Balance_recharge(Flight_sys, log_data);
        break;
    case 8:
        // 用户 - 查看航班
        D_List_print(Flight_sys.Flight_list);
        break;
    case 9:
        // 用户 - 修改密码

        printf("您的原密码：%s\n", log_data.passwd);
        printf("请输入您要修改的新密码：");

        // fgets(new_passwd, sizeof(new_passwd), stdin); // 使用fgets接收输入，避免缓冲区溢出
        // new_passwd[strcspn(new_passwd, "\n")] = '\0'; // 去掉换行符
        scanf("%s", new_passwd);
        user_change_password(&log_data, Flight_sys, new_passwd);
        break;
    case 10:
        // 用户 - 我的订单
        S_Arr_File_print_1(&log_data);
        break;
    case 11:
        // 退出
        break;
    default:
        break;
    }
}

// 合表
U_list *Sys_log_in_1(FlightSystem Flight_sys)
{
    // 用户信息合表
    U_list *list = S_List_init();
    list = S_List_merge(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = S_List_merge(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = S_List_merge(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = S_List_merge(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)

    return list;
}

//管理员修改普通用户等级的菜单
void amend_user(U_data log_data, FlightSystem Flight_sys)
{
    U_list *ptr = (U_list *)malloc(sizeof(U_list));
    ptr->next = NULL;
    ptr->next = Sys_log_in_1(Flight_sys)->next; //用ptr接合并后的数据

    int flag = 0;
    switch (log_data.grade)
    {
    case 1:
        flag = display_menu(title_root, amend_user_option, 4);

        break;

    default:
        break;
    }

    switch (flag)
    {
    case 1:
        printf("白金会员信息\n");
        S_List_print(Flight_sys.PLATINUM_USER);
        amend_user_1(log_data, Flight_sys.PLATINUM_USER, Flight_sys); //改等级

        break;
    case 2:
        printf("金卡会员信息\n");
        S_List_print(Flight_sys.GOLD_USER);
        amend_user_1(log_data, Flight_sys.GOLD_USER, Flight_sys);

        break;
    case 3:
        printf("银卡会员信息\n");
        S_List_print(Flight_sys.SILVER_USER);
        amend_user_1(log_data, Flight_sys.SILVER_USER, Flight_sys);

        break;
    case 4:
        printf("普通用户信息\n");
        S_List_print(Flight_sys.REGULAR_USER);
        amend_user_1(log_data, Flight_sys.REGULAR_USER, Flight_sys);

        break;

    default:
        break;
    }
    free(ptr->next); // 释放ptr->next的内存
    free(ptr);       // 释放ptr的内存
}

//管理员修改普通用户等级的菜单
void amend_user_1(U_data log_data, U_list *Flight_sys, FlightSystem Flight_sys_zon)
{
    int flag;
    flag = display_menu(title_root, amend_user_1_1, 3);
    switch (flag)
    {
    case 1:
        // 修改用户等级
        printf("请输入要修改的用户行数：");
        int user_name;
        scanf("%d", &user_name);
        S_List_update_grade(Flight_sys, user_name, Flight_sys_zon, flag);

        printf("用户等级修改成功！\n");
        break;
    case 2:
        // 修改用户信息
        printf("请输入要修改的用户行数：");
        scanf("%d", &user_name);

        printf("请输入新的用户名：");
        char new_name[50];
        scanf("%s", new_name);

        printf("请输入新的密码：");
        char new_password[50];
        scanf("%s", new_password);

        S_List_update_info(Flight_sys, user_name, new_name, new_password, flag, Flight_sys_zon);

        break;

    default:
        break;
    }
}

//升级管理员
void increase_root(U_data log_data, FlightSystem Flight_sys)
{
    char name;
    int user_id = 1;
    U_data xiuG;
    U_list *ptr = (U_list *)malloc(sizeof(U_list));
    ptr->next = NULL;
    U_list *ptr_1 = S_List_init();

    ptr->next = Sys_log_in_1(Flight_sys)->next; //用ptr接合并后的数据
    S_List_File_scanf(ptr_1, ADMIN_FILE);

    S_List_print(ptr);
    printf("******************");
    S_List_print(ptr_1);
    printf("请输入你想修改的用户名字：");
    scanf("%s", &name);
    S_List_find_name(ptr, &name)->data.grade = user_id;
    xiuG = S_List_find_name(ptr, &name)->data;

    S_List_insert(ptr_1, xiuG, 1);

    printf("设置成功\n");
    S_List_File_print(ptr_1, ADMIN_FILE); //写入文件

    free(ptr->next);   // 释放ptr->next的内存
    free(ptr);         // 释放ptr的内存
    free(ptr_1->next); // 释放ptr->next的内存
    free(ptr_1);       // 释放ptr的内存
    return;
}
